package com.zengdada.authority.service;

import com.github.pagehelper.PageInfo;
import com.zengdada.authority.utils.mapper.Page;
import com.zengdada.authority.utils.mapper.Sort;
import com.zengdada.authority.utils.where.Where;

import java.util.List;
import java.util.Map;

public interface BaseService<T> {

    /**
     * 添加数据
     *
     * @param obj
     * @return
     */
    int add(T obj);

    /**
     * 更具id 修改数据
     *
     * @param obj
     * @return
     */
    int updateById(T obj);

    /**
     * 更具id 删除数据
     *
     * @param id
     * @return
     */
    int deleteById(Object id);

    /**
     * 更具id查询数据
     *
     * @param id
     * @return
     */
    T selectById(Object id);

    /**
     * 更具id查询数据
     *
     * @param id
     * @return
     */
    Map<String,Object> selectDetailedById(Object id);

    /**
     * 查询所有数据
     *
     * @return
     */
    List<T> selectAll();

    /**
     * 分页查询 （可排序 ）
     *
     * @param page 分页情况 null 时查询所有
     * @param sort 排序情况 null 时排序
     * @return PageInfo 分页信息
     */
    PageInfo<T> selectPageInfo(Page page, Sort sort);

    /**
     * 更具条件分页查询 （可排序 ）
     *
     * @param where 查询参数（字段必须为当前实体中存在的，否则会抛出异常）
     * @param page  分页情况 null 时查询所有
     * @param sort  排序情况 null 时排序
     * @return PageInfo 分页信息
     */
    PageInfo<T> selectPageInfoByParam(Where where, Page page, Sort sort);

    /**
     * 更具条件（满足PublicSearch类条件的json数组字符串）分页查询 （可排序 ）
     *
     * @param searchs 查询参数（满足条件的json数组字符串） null 时不带条件查询（字段必须为当前实体中存在的，否则会抛出异常）
     * @param page    分页情况 null 时查询所有
     * @param sort    排序情况 null 时排序
     * @return PageInfo 分页信息
     */
    PageInfo<T> selectPageInfoByParam(String searchs, Page page, Sort sort);


    /**
     * 分页查询详细（子查询查出字段对应的真实信息（修改人 原ID 现在查出名称）需要配置实体类） （可排序 ）
     *
     * @param page 分页情况 null 时查询所有
     * @param sort 排序情况 null 时排序
     * @return PageInfo 分页信息
     */
    PageInfo<Map<String, Object>> selectDetailedPageInfo(Page page, Sort sort);

    /**
     * 更具条件分页查询 （可排序 ）
     *
     * @param where 查询参数（字段必须为当前实体中存在的，否则会抛出异常）
     * @param page  分页情况 null 时查询所有
     * @param sort  排序情况 null 时排序
     * @return PageInfo 分页信息
     */
    PageInfo<Map<String, Object>> selectDetailedPageInfoByParam(Where where, Page page, Sort sort);

    /**
     * 更具条件（满足PublicSearch类条件的json数组字符串）分页查询 （可排序 ）
     *
     * @param searchs 查询参数（满足条件的json数组字符串） null 时不带条件查询（字段必须为当前实体中存在的，否则会抛出异常）
     * @param page    分页情况 null 时查询所有
     * @param sort    排序情况 null 时排序
     * @return PageInfo 分页信息
     */
    PageInfo<Map<String, Object>> selectDetailedPageInfoByParam(String searchs, Page page, Sort sort);

}
